package com.woniuxy.JDKproxy.jdk;

import com.woniuxy.JDKproxy.aspect.Aspect;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 这个类就是我们核心的动态代理的具体实现类
 */
public class JdkProxy {
    //我需要目标类， 因为 目标类需要类加载器 把它加载到 JVM中，所以，我动态生成的代理对象，也必须是同一个类加载器

    /**
     * @todo 动态生成代理对象，增强被代理的方法
     * @param targetClass 被代理的对象
     * @return 增强后的代理对象
     */
    public Object getProxyOject(Object targetClass){
        //返回一个代理后的对象  类似之前的 ShopProxy
        Object proxyInstance = Proxy.newProxyInstance(targetClass.getClass().getClassLoader(), targetClass.getClass().getInterfaces(),
                //这个叫做 匿名内部类 我们直接new 接口 在内部重写接口的实现
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //声明我们的切面
                        Aspect aspect = new Aspect();
                        aspect.log();//调用前置方法
                        //这一步，指的是，被代理对象的方法，通过反射动态生成的方法 并且执行该方法  这个方法类似之前静态工厂中，写死的下列方法
                /*
                  //从工厂进货  在代码中，new了其他的对象这个就叫耦合
                    CoCalColaFactory coCalColaFactory = new CoCalColaFactory();
                    //工厂加工可口可乐
                    coCalColaFactory.cocalColaBrand();

                 */
                        Object obj = method.invoke(targetClass, args);
                        //后置方法
                        aspect.checkPermission();
                        return obj;
                    }
                });
        return proxyInstance;
    }

}
